package org.jeecg.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.domain.dto.HistoryOrdersDto;
import org.jeecg.domain.dto.OrderDto;
import org.jeecg.domain.dto.OrderPageDto;
import org.jeecg.domain.dto.UpdateOrderStatusDto;
import org.jeecg.domain.po.Orders;
import org.jeecg.domain.vo.HistoryOrderVO;
import org.jeecg.domain.vo.OrderVO;
import org.jeecg.service.OrdersService;
import org.jeecg.mapper.OrdersMapper;
import org.jeecg.utils.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;

/**
* @author 32327
* @description 针对表【orders(订单表)】的数据库操作Service实现
* @createDate 2024-12-25 08:42:58
*/
@Service
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders>
    implements OrdersService{
    @Autowired
    private OrdersMapper ordersMapper;
    /*fzy
        查询所有(分页)+条件
    */
    @Override
    public ResponseResult findPage(OrderPageDto dto) {
        // 获取当前日期的凌晨0:00对应的LocalDateTime
        LocalDateTime currentMidnight = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        // 减去365天得到365天前的凌晨0:00对应的LocalDateTime
        LocalDateTime threeHundredSixtyFiveDaysAgoMidnight = currentMidnight.minus(365, ChronoUnit.DAYS);
        // 将LocalDateTime转换为Date类型
        Date date = Date.from(threeHundredSixtyFiveDaysAgoMidnight.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println(date);
        dto.setYearTime(date);
        //        利用分页
        Page<OrderVO> page = new Page<>(dto.getPageNum(), dto.getPageSize());
        System.out.println(dto);
        List<OrderVO> list = ordersMapper.findPage(page,dto);
        page.setRecords(list);
//        page.setTotal(list.size());
        return ResponseResult.okResult(page);
    }
//    订单详情根据id查询订单的状态
    @Override
    public ResponseResult findOrderStatusById(String id) {
        Orders orders = ordersMapper.selectOrdersStatusById(id);
        return ResponseResult.okResult(orders);
    }

    @Override
    public ResponseResult findByStatus(OrderDto dto) {
        System.out.println(dto);
        Page<Orders> page=new Page<>(dto.getPageNum(),dto.getPageSize());
        List<Orders> byStatus = ordersMapper.findByStatus(dto, page);
        page.setRecords(byStatus);
        page.setTotal(byStatus.size());
        return ResponseResult.okResult(page);
    }

    //    每年12月31日24：00：00，系统自动针对本年1月1日 00：00：00 -12月31日 23：59：59 的交易结束订单数据进行清空。
//    交易结束时间是指订单状态已完成/已取消/已关闭时间的第二天00：00点开始
    // 配置定时任务，使用cron表达式设置每年12月31日24:00（即次年1月1日00:00）执行
    @Transactional
    @Scheduled(cron = "0 0 0 1 1 *")
    public void updateOrderStatus() {
        UpdateOrderStatusDto updateOrderStatusDto = new UpdateOrderStatusDto();
//        当前时间
        Date currentDate = new Date();
        System.out.println(currentDate);
        updateOrderStatusDto.setCurrentDate(currentDate);
        // 获取当前日期时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        // 减去365天得到365天前的日期时间
        LocalDateTime threeHundredSixtyFiveDaysAgoDateTime = currentDateTime.minus(365, ChronoUnit.DAYS);
        // 将LocalDateTime转换为Date类型
        Date yearDate = Date.from(threeHundredSixtyFiveDaysAgoDateTime.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println(yearDate);
        updateOrderStatusDto.setYearDate(yearDate);
        ordersMapper.yearTimeDelete(updateOrderStatusDto);
        List<Orders> list = ordersMapper.updateOrderStatus(updateOrderStatusDto);
        if (list.size() > 0) {
            for (Orders orders : list) {
                ordersMapper.yearTimeDeleteById(orders.getId());
            }
        }
    }
}




